package tbs.framework.utils.holders;

import cn.hutool.extra.spring.SpringUtil;
import tbs.framework.utils.BeanUtil;

import java.lang.reflect.InvocationTargetException;
import java.util.Collection;

public interface HolderCommonFunction {

    /**
     * 从Spring容器获取Bean。
     *
     * 注意：此方法假设Spring容器中的Bean为单例模式。
     *
     * @param clazz 类型
     * @param <T>   泛型类型
     * @return Bean实例
     */
    public static <T> T fromSpring(Class<? extends T> clazz) {
        return BeanUtil.getBean(clazz);
    }

    /**
     * 使用无参构造函数创建实例。
     *
     * @param clazz 类型
     * @param <T>   泛型类型
     * @return 实例
     */
    public static <T> T useEmptyConstructor(Class<? extends T> clazz) {
        try {
            return clazz.getConstructor().newInstance();
        } catch (NoSuchMethodException e) {
            throw new RuntimeException("No default constructor found for class: " + clazz.getName(), e);
        } catch (InstantiationException | IllegalAccessException | IllegalArgumentException |
            InvocationTargetException e) {
            throw new RuntimeException("Failed to instantiate class: " + clazz.getName(), e);
        }
    }

    /**
     * 从Spring容器获取Bean，如果不存在则使用无参构造函数创建实例。
     *
     * @param clazz 类型
     * @param <T>   泛型类型
     * @return 实例
     */
    public static <T> T fromSpringIfNullUseEmptyConstructor(Class<? extends T> clazz) {
        T obj = null;
        Collection<? extends T> ls = SpringUtil.getBeansOfType(clazz).values();
        if (ls.isEmpty()) {
            obj = useEmptyConstructor(clazz);
            String beanName = "AUTO_MAKED_" + clazz.getSimpleName() + "_" + obj.toString();
            BeanUtil.registerBean(obj, beanName);
        } else {
            obj = ls.iterator().next();
        }
        return obj;
    }
}
